home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / viewers / prev / prev.lha / ring.c < prev    next >
C/C++ Source or Header  |  1991-03-06  |  1KB  |  84 lines

  1. #include <math.h>
  2. #include <stdio.h>
  3. #include "art.h"
  4. #include "macro.h"
  5. #include "gram.h"
  6.  
  7. extern mats    *mstackp;
  8. extern hlist    *fhlist;
  9. extern float    tolerance;
  10.  
  11. /*
  12.  * ringinit
  13.  *
  14.  *    initialise the function pointers and fields for a sphere object,
  15.  * returning its pointer.
  16.  */
  17. void
  18. ringinit(o, d)
  19.     object    *o;
  20.     details *d;
  21. {
  22.     ring    *rng;
  23.     details    *ld;
  24.     vector    cent, radii1, radii2;
  25.     int    first;
  26.  
  27.     rng = o->obj.rng = (ring *)smalloc(sizeof(ring));
  28.  
  29.     cent.x = cent.y = cent.z = 0.0;
  30.     first = 1;
  31.     radii1.x = radii1.y = 1.0;
  32.     radii2.x = 0.0;
  33.  
  34.     while (d != (details *)NULL) {
  35.         switch (d->type) {
  36.         case CENTER:
  37.             cent = d->u.v;
  38.             break;
  39.         case RADIUS:
  40.             if (first) {
  41.                 radii2.x = radii2.y = d->u.f;
  42.                 radii1.x = radii1.y = d->u.f;
  43.                 first = 0;
  44.             } else
  45.                 radii1.x = radii1.y = d->u.f;
  46.             break;
  47.         case RADII:
  48.             if (first) {
  49.                 radii1.x = radii2.x = d->u.v.x;
  50.                 radii1.y = radii2.y = d->u.v.y;
  51.                 first = 0;
  52.             } else {
  53.                 radii1.x = d->u.v.x;
  54.                 radii1.y = d->u.v.y;
  55.             }
  56.             break;
  57.         default:
  58.             warning("art: illegal field in ring ignored.\n");
  59.         }
  60.         ld = d;
  61.         d = d->nxt;
  62.         free(ld);
  63.     }
  64.  
  65.     pushmatrix();
  66.         translate(cent.x, cent.y, cent.z);
  67.  
  68.         pushmatrix();
  69.             scale(radii1.x, radii1.y, 1.0);
  70.  
  71.             circle(0.0, 0.0, 1.0);
  72.         popmatrix();
  73.  
  74.         if (radii2.x != radii1.x) {
  75.             pushmatrix();
  76.                 scale(radii2.x, radii2.y, 1.0);
  77.  
  78.                 circle(0.0, 0.0, 1.0);
  79.             popmatrix();
  80.         }
  81.     
  82.     popmatrix();
  83. }
  84.